iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 6
0
自我挑戰組

Ruby and Rails 的二三事系列 第 6

Ruby and Rails 的二三事 - Day06 Class(類別) 和 Module(模組) 的不同

  • 分享至 

  • xImage
  •  

什麼是Class(類別)

其實,Class 是很生活化的:

當你和朋友走近一家拉麵店,菜單上面有:
麵條粗細,湯頭濃淡,口味有醬油或是豚骨,蔥花海苔要不要增量...之類的。
點完過了一陣子之後,正妹服務生就會將一碗一碗的拉麵端出來。

是正妹服務生?(快存檔!!)

什麼?你說正妹服務生就是Class? 真是孺子可教也(毆飛)

姆丟啦!
在廚房裡煮拉麵的師傅才是類別(Class),
你菜單上寫的選項就是參數(params),
正妹服務生端出來的拉麵就是實體(instance)

現在你應該看得懂下面這段話:

A class can be so much more -- it can hold its state (by keeping track of instance variables) and be duplicated as many times as you want.


什麼是Module(模組)

當你拿到一隻新的智慧型手機(Class)的時候,通常我們都會想再安裝其他Apps(Module),對吧?

為什麼你會想安裝Apps呢?
當然是因為原生的手機沒有這個功能,或是你下載的Apps有更強大的功能。
這就是Module的概念:用來幫Class擴充方法的工具包,說白一點就是外掛。

現在你應該看得懂下面這段話:

A module will never be anything other than a library of methods.


Class 和 Module 有什麼差別?

一句話:

Class(類別)可以繼承也可以被繼承,但是Module(模組)不行

  • Class 主要是用來產生物件(Object)
  • Module 主要是是提供方法(工具包)和namespace

namespace 是什麼?能吃嗎?

當我們很不幸有同名的類別,又希望他們能執行不同的任務時,
這時候,就可以用module來產生namespace:

#namespace 的用法:各地金城武前來報到
module A
  class Cat
    def initialize
      puts "I come from module A"
    end
  end
end

module B
  class Cat
    def initialize
      puts "I come from module B"
    end
  end
end


patty = A::Cat.new  # 使用A模組裡面的Cat類別

happy = B::Cat.new  # 使用B模組裡面的Cat類別

Class 要怎麼取得 Module 裡的方法?

有兩種做法:

  • include(引入):會產生 實體方法:作用在實體(instance)身上
  • extend(擴充): 會產生 類別方法:作用在類別(class)身上

module Flyable
  def fly
    puts "ButterFly!"
  end
end

class Cat
  include Flyable
  #引入  fly是實體方法
end

class Dog
  extend Flyable
  #擴充  fly是類別方法
end

kitty = Cat.new
kitty.fly #實體方法

Dog.fly   #類別方法

一直下雨好想出去玩啊!!!
鐵人賽我們明天再見囉!

參考資料:
為你自己學 Ruby on Rails
classes-vs-modules
Difference Between Modules And Classes
class-module-mixins


上一篇
Ruby on Rails 的二三事 - Day05 稍微介紹一下:Method 和 Block
下一篇
Ruby and Rails 的二三事 - Day07 Ruby 中的 self 到底是?
系列文
Ruby and Rails 的二三事19
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言